package com.atguigu.lease.web.admin.custom.converter;

import com.atguigu.lease.model.enums.BaseEnum;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.stereotype.Component;

/**
 * 字符串转换枚举的转换器
 *
 * @Author mr.luo
 * @Date 22 5月 2025 20:41
 */
@Component
public class StringTransformationEnumConverterFactor implements ConverterFactory<String, BaseEnum> {

    /**
     * 转换方法
     * ConverterFactor优化,适用于父类结构，类似于baseEntity父类结构
     * 统一编写一系列转换方法，减少重复代码
     * 泛型的作用是左边的类型支持转换成右边的类型的所有子类的转换的
     * 方法的形参是目标类型的class对象，所以就能使用第二种获取到所有枚举实例的方式 targetType.getEnumConstants()
     *
     * @return 枚举实例
     */
    //注意返回的是转换器对象，具体的实现思路与第一种思路一样
    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
        //由于Converter是一个接口，所以需要使用匿名内部类实现
        return new Converter<String, T>() {
            @Override
            public T convert(String source) {
                //使用类的getEnumConstants方法获取枚举实例
                T[] enumTypes = targetType.getEnumConstants();
                //遍历枚举实例
                for (T enumType : enumTypes) {
                    if (enumType.getCode().equals(Integer.valueOf(source))) {
                        return enumType;
                    }
                }
                throw new IllegalArgumentException("非法的枚举值:" + source);
            }
        };
    }
}
